<%@ page import="com.webtest.javabeantest.Customer" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.Map" %>
<%--
  Created by IntelliJ IDEA.
  User: lzy
  Date: 2018/8/14
  Time: 13:41
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>JSTL TEST</title>
    <!-- 新 Bootstrap 核心 CSS 文件 -->
    <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css">
    <script src="https://cdn.bootcss.com/jquery/2.1.1/jquery.min.js"></script>
    <script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body>
<h4>c:url 产生一个url地址，可以Cookie是否可用来智能进行URL重写，对GET请求的参数进行编码，可以把产生的URL存储在对象的属性中，还可以使用c:param为URL添加参数，c:url会对参数进行自动的转码。value中的/代表的是当前WEB应用的根目录</h4>
<c:url value="/test1.jsp" var="testurl">
    <c:param name="name" value="中文字符"/>
</c:url>

url:${testurl}

<h4>c:redirect 使当前JSP页面重定向到指定页面,使当前JSP页面转发到指定页面可以使用</h4>
<%--/代表的内容代表的是当前WEB应用的根目录--%>
<%--response.sendRedirect("/") /代表WEB站点的目录--%>
<%--<c:redirect url="/index1.jsp"/>--%>

<h4>c:import 可以包含任何页面到当前页面</h4>
<%--<c:import url="http://www.baidu.com"/>--%>
<h4>c:forTokens:处理字符串的，类似于String的split</h4>
<c:set value="a,b,c,d;e,f,g;h;j" var="test" scope="request"/>
<c:forTokens items="test" delims=";" var="s">
    ${s}<br/>
</c:forTokens>

<h4>c:forEach:可以对数组，Collection和Map进行遍历</h4>
<c:forEach begin="1" end="10" step="3" var="i">
    ${i} --
</c:forEach>
<br/><br/>
<%
    List<Customer> customers = new ArrayList<>();
    customers.add(new Customer(1, "lili", 14)); // index 0
    customers.add(new Customer(2, "bbb", 14)); // index 1
    customers.add(new Customer(3, "ccc", 15)); // index 2
    customers.add(new Customer(4, "ddd", 16)); // index 3
    customers.add(new Customer(5, "eee", 17)); // index 4

    request.setAttribute("custs", customers);
%>
遍历Collection<br/>
<c:forEach items="${requestScope.custs}" var="cust">
    ${cust.id}--${cust.name}--${cust.age}<br>
</c:forEach>
<br/><br/>
<c:forEach items="${requestScope.custs}" var="cust" varStatus="status">
    ${status.index}:${status.count}:${status.first}:${status.end}:${cust.id}:${cust.name}<br>
</c:forEach>
<br/>
遍历Map<br/>
<%
    Map<String, Customer> cMap = new HashMap<>();
    cMap.put("a", new Customer(1, "lili", 14)); // index 0
    cMap.put("b", new Customer(2, "bbb", 14)); // index 1
    cMap.put("c", new Customer(3, "ccc", 15)); // index 2
    cMap.put("d", new Customer(4, "ddd", 16)); // index 3
    cMap.put("e", new Customer(5, "eee", 17)); // index 4

    request.setAttribute("cMap", cMap);
%>

<c:forEach items="${requestScope.cMap}" var="cust">
    ${cust.key}-${cust.value.id}-${cust.value.name} <br/>
</c:forEach>
<br/><br/>
<%
    String[] names = new String[]{"aa","bb","cc","dd"};
    request.setAttribute("names",names);
%>
<c:forEach var="name" items="${requestScope.names}">
    ${name}<br/>
</c:forEach>

<br/><br/>
<h4>enumation</h4>
<c:forEach items="${pageContext.session.attributeNames}" var="attrName">
    ${attrName}<br/>
</c:forEach>

<h4>c:choose, c:when, c:otherwise, 可以实现if...else if... else if ... else的效果，但较为麻烦
    其中：c:choose以c:when, c:choose的父标签出现。
    c：when, c:otherwise不能脱离c:choose单独使用
    c:otherwise必须在c:when之后使用
</h4>
Judged by age(${param.age}):
<c:choose>
    <c:when test="${param.age>60}">老年</c:when>
    <c:when test="${param.age>35}">中年</c:when>
    <c:when test="${param.age>18}">青年</c:when>
    <c:otherwise>未成年</c:otherwise>
</c:choose>
<h4>c:if：没有else，但可以吧判断的结果存储起来，以备后续使用</h4>
<c:set var="age" value="20" scope="request"/>
<c:if test="${requestScope.age>18}">成年了</c:if>
<br/><br/>
<c:if test="${param.age>18}" var="isAdult" scope="request"/>
isAdult:${requestScope.isAdult}

<h4>c:out：可以移除指定域中的属性值</h4>
<c:set value="1997-07-01" var="date" scope="session"/>
date:${sessionScope.date}
<br/><br/>
<c:remove var="date" scope="session"/>
date:<c:out value="${sessionScope.date}"/>

<h4>c:set:可以为域属性赋值，其中value属性支持EL表达式；还可以为域对象中的JavaBean的属性赋值，target，value都支持EL表达式</h4>
<c:set var="name" value="ATGUIGU" scope="page"/>
name:${pageScope.name}
<br/><br/>
<%--value可以使使用el表达式--%>
<c:set var="subject" value="${param.subject}" scope="session"/>
subject:${sessionScope.subject}
<br/><br/>
<%
    Customer customer = new Customer();
    customer.setId(1001);
    request.setAttribute("customer", customer);
%>
ID:<c:out value="${requestScope.customer.id}"/>
<c:set target="${requestScope.customer}" property="id" value="${param.id}"/>
<br/>
ID:<c:out value="${requestScope.customer.id}"/>
<br/><br/>
<h4>c:out：可以进行特殊字符转义</h4>
<%
    request.setAttribute("book", "《java》");
%>
<%--直接使用el表达式--%>
book:${requestScope.book}
<%--使用c:out--%>
<br/><br/>
book:<c:out value="${requestScope.book}"/>

</body>
</html>
